home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Applications / Eudora 1.3.1 / source / sort.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-16  |  1.5 KB  |  68 lines  |  [TEXT/MPS ]

  1. #define FILE_NUM 36
  2. /* Copyright (c) 1990-1992 by the University of Illinois Board of Trustees */
  3. #pragma load EUDORA_LOAD
  4. #pragma segment Misc
  5.  
  6. #define ARRAY(i)                (array+i*size)
  7. void QSort(UPtr array, int size, int f, int l, int (*compare)(), void (*swap)());
  8. /**********************************************************************
  9.  * QuickSort - sort an array
  10.  * Algorithms, Reingold, Nievergelt, Deo, p. 286
  11.  **********************************************************************/
  12. void QuickSort(UPtr array, int size, int f, int l, int (*compare)(), void (*swap)())
  13. {
  14.     int i,j;
  15.     if (f>=l) return;
  16.     
  17.     (*swap)(ARRAY(f),ARRAY((f+l)/2));
  18.     
  19.     for (i=f+1; (*compare)(ARRAY(i),ARRAY(f))<0; i++);
  20.     
  21.     for (j=l; (*compare)(ARRAY(j),ARRAY(f))>0; j--);
  22.     
  23.     while (i<j)
  24.     {
  25.         (*swap)(ARRAY(i),ARRAY(j));
  26.         for (i++; (*compare)(ARRAY(i),ARRAY(f))<0; i++);
  27.         for (j--; (*compare)(ARRAY(j),ARRAY(f))>0; j--);
  28.     }
  29.     
  30.     (*swap)(ARRAY(f),ARRAY(j));
  31.     
  32.     if ((j-1)-f > l-(j+1))
  33.     {
  34.         QuickSort(array,size,j+1,l,compare,swap);
  35.         QuickSort(array,size,f,j-1,compare,swap);
  36.     }
  37.     else
  38.     {
  39.         QuickSort(array,size,f,j-1,compare,swap);
  40.         QuickSort(array,size,j+1,l,compare,swap);
  41.     }
  42. }
  43.  
  44. int StrCompar(UPtr s1, UPtr s2)
  45. {
  46.     return(IUCompString(s1,s2));
  47. }
  48.  
  49. void StrSwap(UPtr s1, UPtr s2)
  50. {
  51.     Str255 temp;
  52.     
  53.     BlockMove(s1,temp,*(unsigned char *)s1+1);
  54.     BlockMove(s2,s1,*(unsigned char *)s2+1);
  55.     BlockMove(temp,s2,*(unsigned char *)temp+1);
  56. }
  57.  
  58. int CStrCompar(UPtr s1, UPtr s2)
  59. {
  60. #pragma unused(s1,s2)
  61.     return (0);
  62. }
  63.  
  64. void CStrSwap(UPtr s1, UPtr s2)
  65. {
  66. #pragma unused(s1,s2)
  67. }
  68.